package cn.bo.cloud.demo1.configuration;


import cn.bo.cloud.demo1.annotation.IgnoreScan;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * 如果对多个服务使用不同策略，配置多个Ribbon不能被@CompentScan扫描到，否则就是全局配置的效果
 * 但是可以通过自定义注解标记，然后在SpringBoot启动类配置忽略扫描
 */
//@Configuration
//@IgnoreScan
public class RibbonConfig {
    /**
     * 所有负载均衡策略都会实现IRule 接口，里边核心方法就是 choose方法，用来选择一个服务实例。
     *
     * 负载均衡策略
     * 1. RandomRule：随机策略：随机选择server
     * 2. RoundRobinRule	轮询策略	轮询选择， 轮询index，选择index对应位置的Server；
     * 3. RetryRule	重试策略	对选定的负载均衡策略机上重试机制，在一个配置时间段内当选择Server不成功，则一直尝试使用subRule的方式选择一个可用的server；
     * 4. BestAvailableRule	最低并发策略	逐个考察server，如果server断路器打开，则忽略，再选择其中并发链接最低的server
     * 5. AvailabilityFilteringRule	可用过滤策略	过滤掉一直失败并被标记为circuit tripped的server，过滤掉那些高并发链接的server（active connections超过配置的阈值）
     *          或者使用一个AvailabilityPredicate来包含过滤server的逻辑，其实就就是检查status里记录的各个Server的运行状态；
     * 6. ResponseTimeWeightedRule	响应时间加权重策略	根据server的响应时间分配权重，响应时间越长，权重越低，被选择到的概率也就越低。响应时间越短，权重越高，被选中的概率越高，这个策略很贴切，综合了各种因素，比如：网络，磁盘，io等，都直接影响响应时间
     * 7. ZoneAvoidanceRule	区域权重策略	综合判断server所在区域的性能，和server的可用性，轮询选择server并且判断一个AWS Zone的运行性能是否可用，剔除不可用的Zone中的所有server
     *
     * 可以使用代码或者配置方式进行选择。 重点：重写的配置类不能放到ComentScan扫描包下，否则会全局使用同一个策略
     *
     */

    /**
     * 全局
     * @return
     */
    @Bean
    public IRule iRule(){

        return new RandomRule();
    }

}
